﻿using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Sunny.Entity;
using Sunny.Model.RequestParam;
using Sunny.Service;
using Sunny.Util.Exception;

namespace Sunny.Service
{
    public class ConfigService
    {
        private readonly SunnyContext _sunnyContext;

        public ConfigService(SunnyContext sunnyContext)
        {
            _sunnyContext = sunnyContext;
        }
        public async Task<string> GetConfigByKey(string configKey)
        {
           var config = await _sunnyContext.SysConfigs.Where(t=>t.ConfigKey==configKey).FirstOrDefaultAsync();
           return config == null ?"":config.ConfigValue;
        }

        public async Task<(List<SysConfig>, int)> List(ConfigListParam param)
        {
            var sysConfigs = _sunnyContext.SysConfigs.AsQueryable();
            if(!string.IsNullOrEmpty(param.ConfigName))
            {
                sysConfigs = sysConfigs.Where(t=>t.ConfigName.Contains(param.ConfigName));
            }
            if(!string.IsNullOrEmpty(param.ConfigKey))
            {
                sysConfigs = sysConfigs.Where(t=>t.ConfigKey.Contains(param.ConfigKey));
            }
            if(!string.IsNullOrEmpty(param.ConfigType))
            {
                sysConfigs = sysConfigs.Where(t=>t.ConfigType == param.ConfigType);
            }
            
            int total = await sysConfigs.CountAsync();
            var configList = await sysConfigs.OrderBy(t=>t.ConfigId).Skip((param.PageNum-1)*param.PageSize).Take(param.PageSize).ToListAsync();
            return (configList,total);
        }

        public async Task Add(SysConfig sysConfig)
        {
            var hasKey = await _sunnyContext.SysConfigs.AnyAsync(t=>t.ConfigKey == sysConfig.ConfigKey);
            if(hasKey)
            {
                throw new BusinessException(CodeMessage.ConfigKeyExists);
            }
            await _sunnyContext.SysConfigs.AddAsync(sysConfig);
            await _sunnyContext.SaveChangesAsync();
        }

        public async Task<SysConfig> GetConfigById(int configId)
        {
            var config = await _sunnyContext.SysConfigs.SingleOrDefaultAsync(t=>t.ConfigId == configId);
            return config;
        }

        public async Task Update(SysConfig sysConfig)
        {
            var hasKey = await _sunnyContext.SysConfigs.AnyAsync(t=>t.ConfigKey == sysConfig.ConfigKey && t.ConfigId != sysConfig.ConfigId);
            if(hasKey)
            {
                throw new BusinessException(CodeMessage.ConfigKeyExists);
            }

            var config = await _sunnyContext.SysConfigs.SingleOrDefaultAsync(t=>t.ConfigId == sysConfig.ConfigId);
            config.ConfigName = sysConfig.ConfigName;
            config.ConfigKey = sysConfig.ConfigKey;
            config.Remark = sysConfig.Remark;
            config.ConfigType = sysConfig.ConfigType;

            await _sunnyContext.SaveChangesAsync();
        }

        public async Task Delete(int configId)
        {
            SysConfig sysConfig = new SysConfig(){ConfigId = configId};
            _sunnyContext.Attach(sysConfig).State = EntityState.Deleted;
            await _sunnyContext.SaveChangesAsync();
        }
    }
}